const express = require('express')
const Message = require('../util/Message.js')
const RSA = require('../util/rsa.js')
const {User} = require('../util/sequelize.js')
const router = express.Router()
const createToken = require('jsonwebtoken')
const fs = require('fs')
const multer = require('multer')
const upload = multer({
    dest: 'uploads/',
    fileFilter(req, file, cb) {
        cb(null, /(\.jpg)|(\.jpeg)|(\.png)|(\.svg)|(\.mp4)|(\.md)|(\.txt)$/g.test(file.originalname))
    }
})

router.get('/permission', async (req, res) => {
    /*
    * 鉴权逻辑
    * 其实呢，既然它能来到这个接口，就说明它是自己人，因为别人的 token 是进不来的
    * 所以这个 id 也是一定存在的
    * */
    const user = await User.findByPk(req.auth.id)
    if (user) {
        res.send(Message.sendSuccess(user))
    } else {
        res.send(Message.sendFail('token 已失效'))
    }
})
router.post('/login', async (req, response) => {
    /*
    * 登录逻辑
    * 查询用户传过来的账号密码是否存在（期间有对密码加密解密的过程）
    * 存在则发送token，否则返回500
    * */
    let {username, password} = req.body
    password = RSA.toDecrypt(password)
    const user = await User.findOne({
        where: {
            username,
            password
        }
    })
    if (user) {
        const token = createToken.sign({id: user.id}, '...', {expiresIn: '168h'})
        response.send(Message.sendSuccess({token}))
    } else {
        response.status(500).send(Message.sendFail('账号或密码错误'))
    }
})
router.get('/logout', (req, res) => {
    res.send(Message.sendSuccess())
})
router.post('/upload', upload.any(), (req, res) => {
    /*
    * 上传逻辑
    * 先把名字转成 utf8 的编码格式
    * 再通过 fs 模块去读文件，再写到指定路径下面
    * */
    const fileName = Buffer.from(req.files[0].originalname, 'latin1').toString('utf8')
    const path = 'public/image/' + fileName
    fs.readFile(req.files[0].path, (err, data) => {
        if (err) {
            res.send(Message.sendFail('上传失败'))
        } else {
            fs.writeFile(path, data, err => {
                if (err) {
                    res.send(Message.sendFail('上传失败'))
                }else {
                    res.send(Message.sendSuccess({name: fileName, url: 'http://localhost:3000/image/' + fileName}))
                }
            })
        }
    })
})
router.put('/updatePwd', async (req, res) => {
    /*
    * 修改密码逻辑
    * 先判断原始密码是否正确，然后再进行修改
    * */
    let {username, password, newPassword, nickname, avatar} = req.body
    password = RSA.toDecrypt(password)
    newPassword = RSA.toDecrypt(newPassword)
    const user = await User.findOne({
        where: {
            username,
            password
        }
    })
    if (user) {
        if (password === newPassword) {
            res.status(500).send(Message.sendFail('不能与原始密码一致'))
        } else {
            await User.update({ password: newPassword, nickname, avatar }, {
                where: {
                    id: user.id
                }
            })
            res.send(Message.sendSuccess('修改成功'))
        }
    } else {
        // 在前端，响应拦截器中我们一般拿的是 err.response.status
        // res.send() 中 err.response.status 的值默认是 200
        // 因为这里我们希望响应拦截器帮我们发现，而不是我们自己去判断 Message 中 code 的值
        res.status(500).send(Message.sendFail('原始密码错误'))
    }
})
router.post('/signUp', async (req, res) => {
    let {nickname, username, password, type, class_id} = req.body
    password = RSA.toDecrypt(password)
    const [user, boolean] = await User.findOrCreate({
        where: {
            username
        },
        defaults: {
            nickname,
            password,
            type,
            class_id
        }
    })
    if (boolean) {
        res.send(Message.sendSuccess(null, '注册成功'))
    } else {
        res.status(500).send(Message.sendFail('该账号已存在，请重新输入'))
    }
})
router.get('/test', async (req, res) => {
    // res.send(Message.sendSuccess('你好啊'))
    fs.readFile('./public/image/新建 XLSX 工作表.xlsx', (err, data) => {
        if (err) {
            console.info(err)
            res.send(Message.sendFail('上传失败'))
        } else {
            res.send(data)
        }
    })
})
module.exports = router
